package com.aspire.aimini.service;

import java.util.List;
import java.util.Map;

/**
 * 导出Service接口
 *
 * @author wangguiyou
 * @date 2024-01-01
 * @description 导出功能业务逻辑接口
 */
public interface ExportService {

    /**
     * 创建导出任务
     *
     * @param exportType 导出类型(materials, copywriting, tags等)
     * @param format     导出格式(zip, pdf, excel等)
     * @param itemIds    要导出的项目ID列表
     * @param options    导出选项
     * @param userId     用户ID
     * @return 任务ID
     */
    String createExportTask(String exportType, String format, List<Long> itemIds, Map<String, Object> options,
            Long userId);

    /**
     * 查询导出任务状态
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 任务状态信息
     */
    Map<String, Object> getExportTaskStatus(String taskId, Long userId);

    /**
     * 获取导出文件下载链接
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 下载链接
     */
    String getExportDownloadUrl(String taskId, Long userId);

    /**
     * 取消导出任务
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     */
    void cancelExportTask(String taskId, Long userId);

    /**
     * 删除导出任务和文件
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     */
    void deleteExportTask(String taskId, Long userId);

    /**
     * 获取用户的导出任务列表
     *
     * @param userId 用户ID
     * @param page   页码
     * @param size   每页大小
     * @return 任务列表
     */
    Map<String, Object> getUserExportTasks(Long userId, Integer page, Integer size);

    /**
     * 导出素材
     *
     * @param materialIds       素材ID列表
     * @param format            导出格式
     * @param includeMetadata   是否包含元数据
     * @param includeThumbnails 是否包含缩略图
     * @param userId            用户ID
     * @return 任务ID
     */
    String exportMaterials(List<Long> materialIds, String format, Boolean includeMetadata, Boolean includeThumbnails,
            Long userId);

    /**
     * 导出文案
     *
     * @param copywritingIds  文案ID列表
     * @param format          导出格式
     * @param includeMetadata 是否包含元数据
     * @param userId          用户ID
     * @return 任务ID
     */
    String exportCopywriting(List<Long> copywritingIds, String format, Boolean includeMetadata, Long userId);

    /**
     * 导出标签
     *
     * @param tagIds            标签ID列表
     * @param format            导出格式
     * @param includeUsageStats 是否包含使用统计
     * @param userId            用户ID
     * @return 任务ID
     */
    String exportTags(List<Long> tagIds, String format, Boolean includeUsageStats, Long userId);

    /**
     * 导出统计数据
     *
     * @param statsType 统计类型
     * @param format    导出格式
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @param userId    用户ID
     * @return 任务ID
     */
    String exportStatistics(String statsType, String format, String startDate, String endDate, Long userId);

    /**
     * 导出用户数据(完整备份)
     *
     * @param format       导出格式
     * @param includeFiles 是否包含文件
     * @param userId       用户ID
     * @return 任务ID
     */
    String exportUserData(String format, Boolean includeFiles, Long userId);

    /**
     * 批量导出素材(按条件)
     *
     * @param query   查询条件
     * @param format  导出格式
     * @param options 导出选项
     * @param userId  用户ID
     * @return 任务ID
     */
    String batchExportMaterialsByQuery(Map<String, Object> query, String format, Map<String, Object> options,
            Long userId);

    /**
     * 批量导出文案(按条件)
     *
     * @param query   查询条件
     * @param format  导出格式
     * @param options 导出选项
     * @param userId  用户ID
     * @return 任务ID
     */
    String batchExportCopywritingByQuery(Map<String, Object> query, String format, Map<String, Object> options,
            Long userId);

    /**
     * 获取支持的导出格式
     *
     * @param exportType 导出类型
     * @return 支持的格式列表
     */
    List<String> getSupportedFormats(String exportType);

    /**
     * 获取导出模板
     *
     * @param exportType 导出类型
     * @param format     导出格式
     * @return 模板信息
     */
    Map<String, Object> getExportTemplate(String exportType, String format);

    /**
     * 预览导出内容
     *
     * @param exportType 导出类型
     * @param itemIds    项目ID列表
     * @param format     导出格式
     * @param userId     用户ID
     * @return 预览数据
     */
    Map<String, Object> previewExportContent(String exportType, List<Long> itemIds, String format, Long userId);

    /**
     * 估算导出文件大小
     *
     * @param exportType 导出类型
     * @param itemIds    项目ID列表
     * @param format     导出格式
     * @param options    导出选项
     * @param userId     用户ID
     * @return 估算大小(字节)
     */
    Long estimateExportSize(String exportType, List<Long> itemIds, String format, Map<String, Object> options,
            Long userId);

    /**
     * 清理过期的导出文件
     *
     * @return 清理的文件数量
     */
    int cleanExpiredExportFiles();

    /**
     * 获取导出任务统计
     *
     * @param userId 用户ID
     * @return 统计信息
     */
    Map<String, Object> getExportTaskStats(Long userId);

    /**
     * 重试失败的导出任务
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 新任务ID
     */
    String retryExportTask(String taskId, Long userId);

    /**
     * 设置导出任务优先级
     *
     * @param taskId   任务ID
     * @param priority 优先级
     * @param userId   用户ID
     */
    void setExportTaskPriority(String taskId, Integer priority, Long userId);

    /**
     * 获取导出进度
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 进度信息
     */
    Map<String, Object> getExportProgress(String taskId, Long userId);

    /**
     * 暂停导出任务
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     */
    void pauseExportTask(String taskId, Long userId);

    /**
     * 恢复导出任务
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     */
    void resumeExportTask(String taskId, Long userId);

    /**
     * 批量删除导出任务
     *
     * @param taskIds 任务ID列表
     * @param userId  用户ID
     */
    void batchDeleteExportTasks(List<String> taskIds, Long userId);

    /**
     * 获取导出配额使用情况
     *
     * @param userId 用户ID
     * @return 配额使用情况
     */
    Map<String, Object> getExportQuotaUsage(Long userId);
}